﻿//Ext.StoreMgr本质上是一个Ext.util.MixedCollection对象，
//并且在Ext.util.MixedCollection的基础上增加了若干方法

Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {


    //把所有参数放入集合中，参数格式{id:xxx, ……}, {id:xxx, ……}, ……
    register: function () {
        for (var i = 0, s; (s = arguments[i]); i++) {
            this.add(s);
        }
    },

    //移除id对应的注册Store对象，可以有多个id，参数：( String/Object id1, [String/Object id2], [String/Object etc...] ) 
    unregister: function () {
        for (var i = 0, s; (s = arguments[i]); i++) {
            this.remove(this.lookup(s));
        }
    },

    //根据id返回Store对象。如果id是数组，返回一个新的Ext.data.ArrayStore对象，
    //如果id是javascript对象，返回一个已注册的Store对象。
    lookup: function (id) {
        if (Ext.isArray(id)) {
            //当id的第一个元素不是数组时，expand为true，否则为false
            var fields = ['field1'], expand = !Ext.isArray(id[0]);
            //根据id[0]数组的长度向fields数组追加元素
            if (!expand) {
                for (var i = 2, len = id[0].length; i <= len; ++i) {
                    fields.push('field' + i);
                }
            }
            return new Ext.data.ArrayStore({
                data: id,
                fields: fields,
                expandData: expand,
                autoDestroy: true,
                autoCreated: true
            });
        }

        //如果id是一个已创建的对象，直接返回id，如果id是一个配置对象，则创建其实例返回，如果id是字符串，则从注册列表中取实例返回
        return Ext.isObject(id) ? (id.events ? id : Ext.create(id, 'store')) : this.get(id);

        /**************************************************************************
        Ext.create = function() {
            return Ext.ComponentMgr.create.apply(Ext.ComponentMgr, arguments);
        };
        ***************************************************************************/
    },

    //根据store对象获取storeId属性的值
    getKey: function (o) {
        return o.storeId;
    }
});

//注册一个Store，参数：( String id, Object config, Constructor cls )
Ext.regStore = function (name, config) {
    var store;

    //如果第一个参数是配置对象，config为该配置对象
    if (Ext.isObject(name)) {
        config = name;
    }
    else {//如果第一个参数是字符串，则config的storeId属性为该字符串
        config.storeId = name;
    }

    if (config instanceof Ext.data.Store) {//如果config是Ext.data.Store实例，给store直接赋值
        store = config;
    }
    else {//如果是配置对象，创建一个Ext.data.Store实例，再给store赋值
        store = new Ext.data.Store(config);
    }

    //向Ext.StoreMgr注册该store
    return Ext.StoreMgr.register(store);
};

//从Ext.StoreMgr获取name对应的store对象
Ext.getStore = function (name) {
    return Ext.StoreMgr.lookup(name);
};